import { getCurrentInstance } from "./component";

export function provide(key, value) {
    // 存数据
    const currentInstance = getCurrentInstance();
    if (currentInstance) {
        let { provides } = currentInstance;

        const parentProvides = currentInstance.parent.provides;
        // 如果使用了 provide 方法，代表当前组件需要维护一个新的 provides ，同时此 provides 需要继承自 父级
        if (provides === parentProvides) {
            // 当前组件的 provides 和 父组件的 provides 是同一个值的时候，代表需要初始化当前组件的 provides，而不是用父节点的 provides 引用
            // 当前实例组件的 provides 指向父级原型链,从而实现 provides 中的数据自动从 父级继承一份，同时当前组件也可以修改，最终数据为 当前组件的修改+父组件的继承部分
            provides = currentInstance.provides = Object.create(parentProvides);

        }
        provides[key] = value;
    }
}

export function inject(key, defaultValue) {
    // 取数据
    const currentInstance = getCurrentInstance();
    const parentProvides = currentInstance.parent.provides;

    if (key in parentProvides) {
        return parentProvides[key];
    } else if (defaultValue) {
        // 如果 key 不存在 parentProvides 中，返回一个默认值
        if (typeof defaultValue == 'function') {
            return defaultValue();
        }
        return defaultValue;
    }
}  